原题链接1209. 带分数
题目难度:简单(我感觉挺难的)
题目来源:第四届蓝桥杯省赛C++B/C组,第四届蓝桥杯省赛JAVAA/B组
题目描述100 可以表示为带分数的形式:$100 = 3 + \frac{69258}{714}$
还可以表示为:$100 = 82 + \frac{3546}{197}$
注意特征:带分数中,数字 $1 \sim 9$ 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式一个正整数。
输出格式输出输入数字用数码 $1∼9$ 不重复不遗漏地组成带分数表示的全部种数。
数据范围$1 \le N < 10^6$
输入样例1:1100
输出样例1:111
输入样例2:1105
输出样例2:16
题目分析这个题目的理解是比较简单的,就是将一共数字分解成一个整数加一个分数的形式,这里可以形式化的理解为将数字n分解为$n = a + \frac{b}{c}$的形式,需要注意的是b除c并不是整除,在a、b、c中需要出现数字1到9
数据范围是到10的...
原题链接93. 递归实现组合型枚举
题目难度:简单
题目来源:《算法竞赛进阶指南》
题目描述从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。
输入格式两个整数 n,m 在同一行用空格隔开。
输出格式按照从小到大的顺序输出所有方案,每行 1 个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。
数据范围n>0 ,0≤m≤n ,n+(n−m)≤25
输入样例:15 3
输出样例:123456789101 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5
思考题:如果要求使用非递归方法,该怎么做呢?
题目分析这道题和我们之前做到指数类型枚举和排列类型枚举有一定的相关性
组合类型的枚举指的是从n个数中选取m个数,不考虑顺序
首先考虑在手算情况下是如何确保不重不漏的枚举出所有情况的,例如从1到5这5个数字中选取3个数字,一种比较容易想到的方法就是,优先取最小的数...
原题链接95. 费解的开关
题目难度:中等
题目来源:《算法竞赛进阶指南》
题目描述你玩过“拉灯”游戏吗?
25 盏灯排成一个 5×5 的方形。
每一个灯都有一个开关,游戏者可以改变它的状态。
每一步,游戏者可以改变某一个灯的状态。
游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。
我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。
下面这种状态
123451011101101101111000011011
在改变了最左上角的灯的状态后将变成:
123450111111101101111000011011
再改变它正中间的灯后状态将变成:
123450111111001110011010011011
给定一些游戏的初始状态,编写程序判断游戏者是否可能在 6 步以内使所有的灯都变亮。
输入格式第一行输入正整数 n,代表数据中共有 n 个待解决的游戏初始状态。
以下若干行数据分为 n 组,每组数据有 5 行,每行 5 个字符。
每组数据描述了一个游戏的初始状态。
各组数据间用一个空行分隔。
输出格式一共输出 n 行数据,每行有...
原题链接717. 简单斐波那契
题目难度:中等
题目描述以下数列 0 1 1 2 3 5 8 13 21 ... 被称为斐波纳契数列。
这个数列从第 3 项开始,每一项都等于前两项之和。
输入一个整数 N,请你输出这个序列的前 N 项。
输入格式一个整数 N。
输出格式在一行中输出斐波那契数列的前 N 项,数字之间用空格隔开。
数据范围0 < N < 46
输入样例:15
输出样例:10 1 1 2 3
题目分析斐波那契数列一定要先看前两项是如何定义的,这里的前两项是0和1,对于当n大于等于3时,每一项等于前两项的和
这里其实有两种做法,一种是递归,一种是递推
用比较抽象的说法是,递归是把一类大问题分解成若干个类似的子问题,例如要求第n项的数字,只需要求第n-1和第n-2项即可,一直分解到第1项和第2项即可
递推则与之相反,是利用子问题直接计算出原问题的答案,例如同样的的求第n项的数字,我们只需要利用第1项和第2项求和计算出地3项,再利用第2项和第3项计算出第4项,直至计算出第n项
这里的代码非常好写,主要是注重理解递推与递归的含义
示例代码123456789...
原题链接94. 递归实现排列型枚举
题目难度:简单
题目描述把 $ 1 \sim n $ 这 $ n $ 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式一个整数 $ n $。
输出格式按照从小到大的顺序输出所有方案,每行 $ 1 $ 个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
数据范围$ 1 \le n \le 9 $
输入样例:13
输出样例:1234561 2 31 3 22 1 32 3 13 1 23 2 1
题目分析这道题的意思很简单,就是生成从$ 1 \sim n $的全排列,第二个要求就是要按照字典序从小到大输出,字典序就是对于两个序列或者字符串,从头开始比较,只要相同就向后移动,不同的话就是谁小谁的字典序就小,如果都相同就是字典序相同,规定短的序列字典序较小
我们看到数据范围是到$ 9 $的,因此我们可以大致判断出这个题的时间复杂度限制在$O(n*n!)$即可
我们在枚举全排列时有两种方式
第一种是依次枚举每个数放到不同的位置,即固定选择一个数,按照不同位置分类
第二种...
原题链接92. 递归实现指数型枚举
题目难度:简单
题目描述从 $1 \sim n$ 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式输入一个整数 n。
输出格式每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围$1 \le n \le 15$
输入样例:13
输出样例:1234567322 311 31 21 2 3
题目分析这道题目的意思其实一目了然,然后我们可以根据数据范围选择出算法复杂度,实际上是$O(2^n)$级别即可
我们主要的思路就是需要确定从$1\sim n$中确定出这个数是选还是不选,因此所有的情况数就是$2^n$了
这道题的目的其实是训练我们递归的思想,对于递归(dfs)最重要的就是顺序,需要不重不漏的把所有可能的方案都顾及到,具体到这道题我们就只需要从$1\sim n$依次考虑选和不选的两种情况
这样我们就可以画一个递归树
这里我们也称之为递归搜索树,我们以三个数字为例,实际上是可以通过这种...
make/Makefilemakefile实际上是一个自动化构建项目的工具,他是对大型项目的编译工作的集成化处理,他可以处理文件的编译顺序,是否编译,以及对于代码的更复杂的操作
make是一个命令工具,大多数的ide都有这个命令,比如说Delphi的make等
make是一条命令,而makefile是一个文件,我们需要搭配使用完成项目的自动化构建
这里我们演示一下,具体的使用
123456#include<stdio.h>int main(){ printf("hello makefile\n"); return 0;}
然后我们创建一个makefile文件
内容如下
123456test: test.c gcc -o test test.c .PHONY:cleanclean: rm -f *.o test
我们依次来说说这几个命令的意思,第一个test就是会生成的目标的名称,test.c是指的是依赖
目标指的是要编译的目标,也可以是一个动作,依赖可以理解为是项目的源文件
第二行指的是目标下...
gcc\g++的使用这里我们需要知道gcc和g++实际上是对应的c语言和c++编译器,而其他的Java(半解释型),PHP,Python等语言实际上是解释型语言,因此我们经常能听到c语言是偏向底层的语言
我们这里就以c语言为例,进行基础的讲解
我们知道计算机只能处理二进制代码,而在计算机发展的过程中,将二进制代码是用类似打孔纸带的东西承载的,再之后发展就是由汇编语言,将众多常用的二进制代码用助记符来表示,之后再由汇编语言发展而来的各类底层语言,也就是c语言
那我们把上面的过程反过来,就是电脑能够理解我们所写代码含义的过程了,也就称之为编译
在编译的过程中实际上分为四个阶段
那我们能否将编译的过程分段查看呢,其实在Linux中是可以做到的,只需要用一些指令即可
预处理在这个阶段中,主要做一些准备工作,例如头文件展开,删除注释,条件编译,宏替换,这些工作都是在预处理阶段完成的,例如
我们首先使用vim创建一个c语言文件
1vim test.c
123456789101112#include<stdio.h>int main(){ int i = 0; ...